package utils

import (
	"context"
	"fmt"
	"github.com/redis/go-redis/v9"
	"github.com/spf13/cast"
	"time"
)

// 对长度不足n的数字前面补0
func sup(i int64, n int) string {
	m := fmt.Sprintf("%d", i)
	for len(m) < n {
		m = fmt.Sprintf("0%s", m)
	}
	return m
}

// GenerateTodayIndex 每天按1...生成序列号
func GenerateTodayIndex(redisDb *redis.Client, prefix string) string {
	// 获取天
	_, _, day := time.Now().Date()
	redisKey := fmt.Sprintf("%sRedisKey:%d", prefix, day)
	value, _ := redisDb.Get(context.Background(), redisKey).Result()
	if value == "" {
		value = "1"
		if _, err := redisDb.Set(context.Background(), redisKey, value, 24*60*60*time.Second).Result(); err != nil {
			return ""
		}
	} else {
		redisDb.Incr(context.Background(), redisKey)
		value, _ = redisDb.Get(context.Background(), redisKey).Result()
	}
	return value
}

// GenerateTodayOrderNo 生成订单号
func GenerateTodayOrderNo(redisDb *redis.Client, prefix string) string {
	date := time.Now().Format("20060102")
	// 获取天
	_, _, day := time.Now().Date()
	redisKey := fmt.Sprintf("%sRedisKey:%d", prefix, day)
	value, _ := redisDb.Get(context.Background(), redisKey).Result()
	if value == "" {
		value = "1"
		if _, err := redisDb.Set(context.Background(), redisKey, value, 24*60*60*time.Second).Result(); err != nil {
			return ""
		}
	} else {
		redisDb.Incr(context.Background(), redisKey)
		value, _ = redisDb.Get(context.Background(), redisKey).Result()
	}
	valueInt := cast.ToInt64(value)
	orderSn := fmt.Sprintf("%s%s%05d", prefix, date, valueInt)
	return orderSn
}

// 生成每日流水号
func GenerateSN(redisDb *redis.Client, date time.Time, prefix string) string {
	day := date.Format("20060102")
	redisKey := fmt.Sprintf("%sRedisKey:%s", prefix, day)
	value, _ := redisDb.Get(context.Background(), redisKey).Result()
	if value == "" {
		value = "1"
		if _, err := redisDb.Set(context.Background(), redisKey, value, 24*7*60*60*time.Second).Result(); err != nil {
			return ""
		}
	} else {
		redisDb.Incr(context.Background(), redisKey)
		value, _ = redisDb.Get(context.Background(), redisKey).Result()
	}
	valueInt := cast.ToInt64(value)
	sn := fmt.Sprintf("%s%s%04d", prefix, day, valueInt)
	return sn
}

// 入库批次号
func StorageBatchNumber(redisDb *redis.Client, date time.Time, spuID int64, prefix string) string {
	day := date.Format("20060102")
	redisKey := fmt.Sprintf("%sRedisKey:%s-%d", prefix, day, spuID)
	value, _ := redisDb.Get(context.Background(), redisKey).Result()
	if value == "" {
		value = "1"
		if _, err := redisDb.Set(context.Background(), redisKey, value, 24*60*60*time.Second).Result(); err != nil {
			return ""
		}
	} else {
		redisDb.Incr(context.Background(), redisKey)
		value, _ = redisDb.Get(context.Background(), redisKey).Result()
	}
	valueInt := cast.ToInt64(value)
	sn := fmt.Sprintf("%s%s%04d-%04d", prefix, day, valueInt, spuID)
	return sn
}
